API是從BeakPlatform外部發動流程的唯一方式,有兩種建立API的方式,今天先介紹讓企業管理員建立的方式,但是管理員太累了,而且放著流程自動化工具不用太浪費,可以透過表單系統配發,而且還能留下稽核記錄,下篇說明
| 項目 | 說明 |
|---|---|
| 本篇一句話目標 | 替一台設備(本篇以 WAF-01 為例)在「API Key 管理」建立一把只能建立資安案件的 API Key,並把 key_id 與 secret 交給設備。 |
| 你需要的身分 | 企業管理員。「系統安全」選單只開放給企業管理員,一般員工與系統管理員看不到。 |
| 做完會得到什麼 | 一組 key_id/secret,以及一個能確認「設備真的打進來了」的檢查點(列表的「最後使用」欄)。設備拿這組憑證呼叫 POST /api/trigger/form 建立資安案件,做法在第 03 篇。 |
| 預估時間 | 10 分鐘 |
平台有兩條拿到 API Key 的路徑。本篇是企業管理員直接配發:管理員在「系統安全 / API Key 管理」替一台設備建立 Key,當場拿到 secret,再交給設備。另一條是第 02 篇的表單中心申請單:員工自己填「API Key 申請單」,管理員核准後由系統核發,歸屬人本人到個人設定領取。
設備符合以下任一情況,用本篇這條:
| 比較項目 | 本篇:管理員直接配發 | 第 02 篇:透過表單中心申請 |
|---|---|---|
| 誰發起 | 企業管理員 | 員工本人(也可替同事申請),管理員只做核准 |
| Key 歸屬 | 設備或外部系統;可選擇綁定一個專用員工帳號當申請人 | 申請單上的「使用者(Key 歸屬人)」個人 |
| 授權範圍 | 表單分類(含子分類)、個別已發行表單、資安事件接收(三者可並用) | 表單模板;限歸屬人自己填得到、且已發行的表單 |
| secret 給誰 | 建立當下在管理員畫面顯示一次,由管理員轉交設備 | 歸屬人本人在「個人設定 / 我的 API Key」按「領取金鑰」,核發後 72 小時內有效 |
| secret 遺失 | 沒有重發功能,只能撤銷後重建一把 | 本人可按「重新產生金鑰」,舊金鑰立即失效 |
| 管理員之後能改什麼 | 名稱、標籤、說明、期限、來源 IP 白名單、授權範圍、綁定帳號 | 可暫停、撤銷、改來源 IP 白名單;表單模板授權不可在管理端編輯 |
| 適合 | 設備專用 Key、要鎖 IP、要綁專用帳號 | 員工自助、Key 歸屬個人 |
以企業管理員登入後,左側選單「系統安全 / API Key 管理」,網址是 http://192.168.0.112:8000/beakplatform/security/api-keys/ 。頁面上方的說明是「外部系統以 HMAC 簽章發動表單流程的專屬金鑰。每個外部系統/裝置一把 Key,來源清楚可稽核。」——一台設備一把 Key,不要多台共用。
找不到「系統安全」這個群組,代表目前登入的帳號不是企業管理員;請換帳號,不要用系統管理員或一般員工帳號嘗試。
按右上角的「建立 API Key」按鈕。視窗欄位如下,欄位名稱與畫面一致:
| 欄位 | 必填 | 說明 |
|---|---|---|
| 名稱 | 必填 | 這把 Key 的用途名稱,列表以此顯示。留空按「建立」會提示「請填寫名稱」。畫面提示範例:「如:台北機房防火牆事件通報」。 |
| 使用者標籤 | 選填 | 標示持有這把 Key 的設備。畫面說明:「標示這把 Key 由哪個外部系統/裝置持有,發動的表單會以此顯示來源」。沒有綁定申請人時,設備建出的案件「申請人」就顯示這個標籤。建議寫成「設備名 (IP)」,例如 WAF-01 (192.168.0.111)。 |
| 說明 | 選填 | 備註用,最多 500 字。 |
| 使用期限 | 選填 | 日期欄位,畫面提示「留空 = 永久有效」。到期判定的細節見第 6 節。 |
| 來源 IP 白名單 | 選填 | 一行一筆,支援單一 IP 與 CIDR(畫面提示「一行一筆,支援 CIDR,如 192.168.1.254 或 10.0.0.0/24」)。畫面說明:「留空 = 不鎖 IP(動態 IP 場景建議留空,改以暫停 Key 做處置)」。格式不合法會拒絕建立並顯示「IP 或 CIDR 格式錯誤: 」加上那一筆。判定方式見第 5 節。 |
| 授權範圍 - 表單分類(勾選父分類即涵蓋其子分類) | 選填 | 勾選分類後,該分類(含子分類)底下所有已發行的表單都可以由這把 Key 建立,之後在分類裡新增的表單自動納入。清單父分類在前、子分類縮排在後。 |
| 授權範圍 - 個別表單(例外直綁) | 選填 | 直接勾選特定已發行表單。清單只列目前已發行的表單,未發行的不會出現。 |
| 授權範圍 - 資安事件接收(OpenDefense intake,選填) | 選填 | 每行一個 source_system。畫面說明:「填寫後此 Key 可推送資安事件至 /api/open_defense/intake,source_system 必須在此清單」。這不是本系列的路徑,一般設備留空,見 2.3。 |
| 綁定申請人(專用系統帳號) | 選填 | 下拉預設「不綁定(申請人顯示使用者標籤)」。選了帳號後,畫面說明:「綁定後,發動的表單以此帳號為申請人,簽核鏈身分清楚」。下拉只列本企業的一般員工帳號(顯示為「顯示名稱 (帳號)」),企業管理員與外部帳號選不到。 |
底部按鈕:「取消」、「建立」。
三個授權範圍欄位可以並用,任一個涵蓋到目標表單即可建單。本系列的設備只走 POST /api/trigger/form,所以:
授權範圍只決定「能建哪張表單」,不決定欄位
設備送進來的欄位必須是那張表單的欄位,欄位名對照在第 03 篇。這裡只要確定表單在範圍內就好。
| 欄位 | 填入值 |
|---|---|
| 名稱 | WAF-01 事件通報 |
| 使用者標籤 | WAF-01 (192.168.0.111) |
| 說明 | WAF 事件自動建案 |
| 使用期限 | 留空 |
| 來源 IP 白名單 | 192.168.0.111(設備會經 NAT 出去時填 NAT 後的位址,見第 5 節;不確定就先留空) |
| 授權範圍 - 表單分類 | 勾「資安案件」 |
| 授權範圍 - 個別表單 | 留空 |
| 授權範圍 - 資安事件接收 | 留空 |
| 綁定申請人 | 不綁定(要綁時先替設備建一個一般員工帳號,例如 svc-waf01) |
按「建立」,成功後視窗關閉並跳出「API Key 已建立」視窗,進入第 3 節。
視窗最上方是紅色提示:「Secret 僅顯示這一次,關閉後無法再查看。請立即複製並安全交付給外部系統。」接著是兩行:
key_id: ak_a85efc52cc2455a4
secret: <領取時顯示一次的 secret>
下方一行小字是簽章方式:「簽章方式:HMAC-SHA256(secret, "{timestamp}\n{body}"),headers:X-BP-Key-Id / X-BP-Timestamp / X-BP-Signature。工具與範例:scripts/bp_trigger.py、docs/install/api_trigger.md。」這行是給要自己實作簽章的人看的,第 03 篇會逐項說明;現在只要把兩個值存好。
按鈕「複製」會把上面兩行(含 key_id:/secret: 前綴)放進剪貼簿,成功後按鈕文字變成「已複製」;按「我已保存,關閉」視窗就關閉,secret 隨即從畫面與記憶體丟棄,列表與任何查詢都不會再回傳它。
關閉視窗前先把 secret 存到設備的設定檔或密碼庫
管理端沒有「重新顯示」也沒有「重發」。關掉之後才發現沒存到,唯一的做法是「撤銷」這把 Key 再建一把新的(第 4 節)。第 02 篇透過申請單核發的個人 Key 才有「重新產生金鑰」按鈕,本篇這條路徑沒有。
建議把三個值放進設備或工作機的環境變數,bp_trigger.py 就認這三個名字:
export BP_BASE_URL='http://192.168.0.112:8000/beakplatform'
export BP_KEY_ID='ak_a85efc52cc2455a4'
export BP_SECRET='<領取時顯示一次的 secret>'
bp_trigger.py 在平台安裝目錄的 scripts/ 底下,只用 Python 3 標準函式庫,複製到任何有 python3 的主機都能跑。先列出這把 Key 能建的表單:
python3 <平台安裝目錄>/scripts/bp_trigger.py --list
成功時第一行是「列出可發動表單成功(HTTP 200)」,接著是 JSON;以 2.4 的設定,data 陣列會有三筆,form_code 分別是 SEC_INCIDENT_RESPONSE、SEC_IR_SOC_TEAM、SEC_IR_SOLO,每筆的 field_keys 就是可送的欄位名。回到「API Key 管理」重新整理,這把 Key 的「最後使用」欄會從 - 變成時間。
如果回的是「列出可發動表單失敗(HTTP 401)」與 {"error": "auth_failed"},先看第 6 節的排除順序。
建立成功時系統回傳的紀錄長這樣(畫面只顯示其中 key_id 與 secret;識別碼欄位以佔位表示):
{
"key_id": "ak_a85efc52cc2455a4",
"name": "WAF-01 事件通報",
"consumer_label": "WAF-01 (192.168.0.111)",
"description": "WAF 事件自動建案",
"scopes": {"form_category": ["<資安案件分類的識別碼>"], "form": []},
"allowed_ips": null,
"applicant_user_secure_code": null,
"expires_at": null,
"status": "active",
"last_used_at": null,
"secret": "<領取時顯示一次的 secret>"
}
scopes 就是三個授權範圍欄位的儲存形式:form_category(分類)、form(個別表單)、od_intake.source_systems(資安事件接收,沒填就不會出現這個 key)。allowed_ips 留空存成 null,代表不鎖。
| 欄位 | 內容 |
|---|---|
| Key ID | ak_… 公開識別碼。設備送出的 X-BP-Key-Id 就是它。 |
| 名稱 / 使用者 | 上行是「名稱」,下行小字是「使用者標籤」。 |
| 授權範圍 | 摘要成「分類 x1」、「表單 x2」、「表單模板 x1」(申請流程核發的 Key 才會有)、「資安事件來源 x1」,以「、」相連;都沒有時顯示「(無授權範圍)」——這種 Key 什麼表單都建不了。 |
| IP 鎖定 | 白名單內容以逗號相連;沒設顯示「不鎖」。 |
| 期限 | 日期;沒設顯示「永久」。 |
| 最後使用 | 最近一次驗章成功的時間(依你的顯示時區);從未使用顯示 -。 |
| 狀態 | 「啟用中」或「已暫停」;已暫停的下方會顯示暫停原因。已撤銷的 Key 不會出現在列表。 |
| 操作 | 「編輯」、「暫停」(啟用中時)或「復原」(已暫停時)、「撤銷」。 |
列表只有本企業的 Key,依建立時間新的在前。
| 操作 | 畫面 | 效果 | 什麼時候用 |
|---|---|---|---|
| 編輯 | 開啟與建立相同的視窗,標題「編輯 API Key」,按鈕「儲存」。 | 可改名稱、使用者標籤、說明、使用期限、來源 IP 白名單、三個授權範圍、綁定申請人。secret 不能改、也不會顯示。儲存後設備不必換憑證。 | 設備換 IP、要多授權一張表單、要補綁專用帳號。 |
| 暫停 | 視窗「暫停 API Key」,說明「暫停後外部系統立即無法使用此 Key(回 401),可隨時復原。疑似 Key 遭盜用時的首選處置。」;「暫停原因」必填(留空會提示「請填寫暫停原因」);按「確認暫停」。 | 狀態變「已暫停」,設備的每一次呼叫都回 401 auth_failed;原因顯示在列表狀態欄下方。 | 疑似外洩、設備維護、暫時不想收它的事件。可逆,先暫停再查。 |
| 復原 | 直接生效,訊息「已復原」。 | 狀態回「啟用中」,暫停原因清除,設備沿用原本的 secret 立即可用。 | 查證完畢要恢復收事件。 |
| 撤銷 | 瀏覽器確認框「撤銷後不可復原,外部系統將立即無法使用此 Key。確定撤銷「〈名稱〉」?」 | 狀態變「已撤銷」並從列表消失,不可復原。要再用得重建一把、重新交付 secret。 | 確認外洩、設備除役、secret 遺失要重發。 |
設備每一次通過驗章(headers、時間戳、Key 狀態、來源 IP、簽章五關全過),平台就把這把 Key 的「最後使用」更新為當下時間,然後才處理請求內容。所以:
平台比對的是它看到的連線來源位址。設備經過 NAT、代理或 VPN 出口才連到平台時,平台看到的是轉換後的位址,白名單要填那個,不是設備自己網卡上的 IP。不確定設備出口是什麼,就先留空,用第 3.3 節的 --list 打通後,再從平台端的應用程式日誌看這把 Key 被記錄的 ip= 是多少,填上去。
設備是動態 IP 時不要鎖:畫面提示的做法是留空,遇到異常改用「暫停」處置。

五關任一失敗,設備收到的都是同一個回應:HTTP 401、{"error": "auth_failed"}。平台刻意不告訴呼叫端是哪一關失敗,避免被拿來探測;真正的原因只記在平台端的應用程式日誌。所以來源 IP 被擋時,設備端看起來跟 secret 錯誤一模一樣。
實際例子:一把來源 IP 白名單設為 192.168.0.111 的 Key,從另一台主機執行 --list,得到的是:
列出可發動表單失敗(HTTP 401)
{
"error": "auth_failed"
}
回 401 卻不知道為什麼
症狀:設備或 --list 一律得到 HTTP 401 auth_failed,「最後使用」始終是 -。
原因:驗章五關之一沒過,回應不會說是哪一關。
做法:照驗章順序逐項排除,每一步都排除了再看下一步:
1.header 齊不齊:自己實作時確認 X-BP-Key-Id、X-BP-Timestamp、X-BP-Signature 三個都有送,任一個空白直接 401。用 bp_trigger.py 可略過這一步。
2.時鐘:設備與平台的時間差必須在 300 秒內。在設備上跑 date -u +%s,和平台主機比一下;設備沒對 NTP 是最常見的原因。
3.Key 狀態:到列表看這把 Key 的「狀態」是不是「啟用中」、「期限」有沒有過;已撤銷的 Key 不會在列表上,找不到就是被撤銷了。
4.來源 IP:「IP 鎖定」欄有值時,確認平台看到的來源位址在白名單內(第 5.2 節)。要快速切割,先「編輯」把白名單清空試一次。
5.secret 與簽章:確認 BP_KEY_ID 對到列表上的 Key ID、BP_SECRET 是建立時原樣複製(沒有多空白、沒有少 =)。自行實作簽章時先拿 bp_trigger.py 用同一組憑證打一次,能過就是簽章實作的問題,不是憑證的問題。
另外,同一個來源位址一分鐘內累積 30 次 401 之後,平台會改回 HTTP 429({"success": false, "error": "請求頻率過高,請稍後再試"})。排錯時不要讓設備在迴圈裡重試,先停下來,一分鐘後再試。
「使用期限」填的那一天一開始就失效,不是那天結束
症狀:期限填 3 月 31 日,31 日早上設備就開始 401。
原因:管理端把日期存成該日 00:00(UTC),平台以 UTC 判斷是否過期,換算成台灣時間是當天早上 8 點。 > 做法:期限填「最後可用日的隔一天」;或到期前一天先「編輯」延長。留空則永久有效。
分類勾了,設備卻建不了那張表單
症狀:回 HTTP 422 form_not_published(訊息「表單尚未發行」或「表單已有發行記錄,但目前沒有 Published 版本」),或 HTTP 404 form_not_found。
原因:授權範圍只涵蓋已發行的表單。表單在範圍內但沒有發行中的版本是 422;form_code 打錯、表單不在這把 Key 的範圍內、表單不屬於本企業,都是 404,平台刻意不區分「不存在」與「沒授權」。
做法:先用 --list 看這把 Key 目前能建哪些 form_code;沒列出來就去「表單管理 / 表單流程配對」確認該表單已發行,或回「編輯」補授權。
綁定專用帳號後,案件的申請人就是那個帳號
設備建出的案件在表單中心、待簽核清單與案件內容的「申請人」欄位顯示的是:有綁定申請人時,顯示該帳號的顯示名稱;沒綁定時,顯示「使用者標籤」;連標籤也沒填,就顯示 Key 的「名稱」。綁定的帳號之後被停用或刪除,設備的呼叫會回 HTTP 422 applicant_invalid(訊息「API Key 綁定的系統帳號不存在或已停用」)——這不是 401,看到它就直接去「編輯」換綁或改成不綁定。
「綁定申請人」下拉找不到想綁的帳號
下拉只列本企業「啟用中的一般員工」帳號,企業管理員與外部帳號不會出現;而且最多列 100 位(依建立時間新的在前)。要替設備綁專用帳號,先在帳號管理建一個一般員工帳號再回來綁。
「最後使用」有值不等於建單成功
它在驗章通過的那一刻就更新,之後的 400(欄位名錯)、404(表單不在範圍)、422 都不會把它清掉。確認案件有沒有建起來,看設備收到的回應,或到「開放防禦 / 資安案件處置中心」找案件編號(第 03 篇)。
如果設備其實是某位員工在維護、Key 該歸屬那個人,改走第 03 篇 透過表單中心申請 API Key。